Amazon SNS Extended Client Library for Python を使って、256 KB を超えるペイロードを処理させてみた
こんにちは、森田です。
以下のアップデートにあるように、Python 用の Amazon SNS 拡張クライアントライブラリが公開されました。
このライブラリを利用することで Amazon SNS で 256KB以上のペイロードを処理できるようになります。
本記事では、実際にこのライブラリを使って動作を見ていきたいと思います。
はじめに
このライブラリを使用することで、Amazon SNS の制限値が増えるわけではなく、制限値以上のペイロードを扱えるように内部で処理してくれます。
具体的には、Amazon SNS で 256 KB を超えるペイロードを処理できるように、S3にペイロード情報を保存して、S3の参照先を Amazon SNSのペイロードとしているようです。
実際にライブラリを使ってその仕様を確認してみます。
やってみた
事前準備
まずは、ライブラリを以下のコマンドでインストールします。
pip install amazon-sns-extended-client
SNS トピックの作成
続いて、送信するSNSトピックを準備します。
タイプはスタンダードとして選択し、他はデフォルトの状態で作成します。
動作確認のため、作成した SNSトピックにサブスクリプションをEメールで作成します。
S3 バケットの作成
ペイロードを保存するS3バケットを作成します。
こちらもデフォルトの設定で作成します。
SNS トピックへの送信
SNS トピックへ送信するためのコードを作成します。
以下のコードでは、画像データ(256KB以上)を読み込み、base64エンコードしたものをペイロードとしています。
import boto3 import base64 import sns_extended_client import json sns = boto3.client('sns') sns.large_payload_support = '作成したS3バケット' # 画像ファイルを開いて、バイナリモードで読み込む with open("sample.jpg", "rb") as image_file: encoded_string = base64.b64encode(image_file.read()).decode("utf-8") data = json.dumps({'image': encoded_string}) topic_arn = "作成したSNSトピックのArn" response = sns.publish( TopicArn=topic_arn, Message=data, Subject="TEST" ) print("response is {}".format(response))
上記のコードを見ていただければわかるように、
import sns_extended_client
sns.large_payload_support = '作成したS3バケット'
を設定するだけ簡単に実装できます。
あとは、上記のスクリプトを実行してみると、以下のようにペイロードとして、S3のパスなどが登録したメールアドレスに送信されます。
ちなみに、256KB以下のファイル送った場合は、S3を使用せず、以下のようにそのままのデータが送信されます。
デフォルトでは、S3を使った送信とするか、そのままのデータで送信するかの閾値として256KBとなっていますが、
パラメータを指定することで、全てS3を使った送信とすることや任意の閾値とすることも可能です。
sns.always_through_s3 = True
sns.message_size_threshold = 65536
最後に
SNS 拡張クライアントライブラリを触ってみましたが、たった数行で256 KB を超えるペイロードを処理できるため、とても便利だと感じました。
実際には、送信したペイロードの実データはS3上に保存されているので、サブスクリプション側でデータを読み込みたい場合などは、S3 Get Objectをする必要がありそうです。